package com.person.yhzs.family.service;

import com.person.yhzs.common.ReturnData;
import com.person.yhzs.common.page.PageRequest;
import com.person.yhzs.common.page.PageResponse;
import com.person.yhzs.family.entity.Family;
import com.person.yhzs.family.entity.UserFamily;
import com.person.yhzs.family.entity.dto.FamilyDto;
import com.person.yhzs.family.entity.dto.QueryDto;
import com.person.yhzs.family.entity.vo.FamilyPersonTreeModelVo;
import com.person.yhzs.family.entity.vo.FamilyVo;
import com.person.yhzs.user.entity.dto.UserDto;

import java.util.List;
import java.util.Map;

/**
 * @author luolin
 * @version 1.0.0
 * @ClassName FamilyService.java
 * @Description 家谱服务接口
 * @createTime 2022年05月30日 11:31:00
 */
public interface FamilyService {

    /* 添加家谱  */
    Integer addFamily(Family family,String userId);
    /* 编辑家谱 */
    Long editFamily(Family family);

    /* 查询家谱详情 */
    FamilyVo queryFamily(FamilyDto familyDto);

    /* 查询家谱列表 */
    List<FamilyVo> queryFamilyList(FamilyDto familyDto, Integer pageIndex, Integer pageSize);

    Long listFamilyCount(FamilyDto familyDto);

    PageResponse<FamilyVo> queryFamilyPage(PageRequest<QueryDto> queryDto);

    /* 查询家谱的字辈 */
    List<Map<String,String>> queryFamilyWords(Long familyId);

    /**
     * @Description 加入家谱
     * @Author luolin
     * @Date 2022/5/31 13:43
     **/
    UserFamily joinFamily(Long userId, Long familyId);

    /**
     * @Description 加入家谱
     * @Author luolin
     * @Date 2022/5/31 13:43
     * familyId：家谱id
     * type:添加的人员关系，1、子女，2、兄弟，3、配偶，4、父母
     * userDto：新增的人员信息
     **/
    void familyAddPerson(Long familyId, Integer type, UserDto userDto);


    /**
     * @Description 校验是否存在该号码
     * @Author luolin
     * @Date 2022/9/28 16:50
     **/
    Boolean checkPhone(String phone);

    /**
     * @Description 校验是否存在该身份证号
     * @Author luolin
     * @Date 2022/9/28 16:50
     **/
    Long checkIdCard(String idCard);

    /**
     * 检查是否已经拥有配偶或者父母
     * @param familyId
     * @param userId
     * @return
     */
    FamilyPersonTreeModelVo checkHaveOption(Long familyId,Long userId);

//    selectUserFamilyInfoByRelationId()
    /**
     * 检查是否已经拥有配偶或者父母
     * @param relationId
     * @return
     */
    FamilyPersonTreeModelVo checkHaveOptionByRelationId(Long relationId);

    /**
     * @Description 获取家族成员
     * @Author luolin
     * @Date 2022/9/23 14:09
     **/
    List<FamilyPersonTreeModelVo> getFamilyPerson(Long familyId);

    /**
     * @Description 获取家族成员的某个成员
     * @Author luolin
     * @Date 2022/9/23 14:09
     **/
    FamilyPersonTreeModelVo getFamilyPersonOne(Long familyId,Long userId);

    /**
     * @Description 获取家族成员的某个成员，通过关系id查找
     * @Author luolin
     * @Date 2022/9/23 14:09
     **/
    FamilyPersonTreeModelVo getFamilyPersonOneByRelationId(Long relationId);

    /**
     * @Description 移除家家族成员（个人）
     * @Author luolin
     * @Date 2022/10/14 10:01
     **/
    void removeFamilyPersonSelf(Long familyId,Long userId);

    /**
     * @Description 通过关系id移除家家族成员（个人）
     * @Author luolin
     * @Date 2022/10/14 10:01
     **/
    void removeFamilyPersonSelfByRelationId(Long relationId);

    /**
     * @Description 替换家谱人员
     * @Author luolin
     * @Date 2022/10/14 14:25
     **/
    void replaceFamilyPersonByRelationId(Long relationId,Long replaceId);

    /**
     * @Description 替换家谱人员的配偶
     * @Author luolin
     * @Date 2022/10/14 14:25
     **/
    void replaceFamilyPersonMate(Long relationId,Long replaceId);

    /**
     * @Description 删除家谱人员以及以下人员
     * @Author luolin
     * @Date 2022/10/14 14:25
     **/
    void removeFamilyPersonSelfAndChild(Long familyId,Long pId);

    /**
     * 移除配偶
     * @param relationId
     */
    void removeFamilyPersonSelfMate(Long relationId);

    /**
     * 删除家谱
     * @param familyId
     */
    void deleteFamily(Long familyId);
}
